Serialization এবং Deserialization হল দুটি গুরুত্বপূর্ণ প্রক্রিয়া যা Java তে অবজেক্ট ডেটাকে সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত হয়।
- Serialization: এটি একটি প্রক্রিয়া যেখানে Java অবজেক্টটিকে বাইনারি ফরম্যাটে বা স্টোরেজে (ফাইল, ডাটাবেস, নেটওয়ার্ক, ইত্যাদি) সেভ করা হয়।
- Deserialization: এটি হলো সেই প্রক্রিয়া যেখানে একটি সিরিয়ালাইজড অবজেক্ট থেকে ডেটা পুনরুদ্ধার করা হয় এবং একটি অবজেক্টে ফিরিয়ে আনা হয়।
Java তে Serialization এর জন্য Serializable ইন্টারফেস এবং Deserialization এর জন্য ObjectInputStream ব্যবহার করা হয়।
Java Serialization and Deserialization Example
Step 1: Create a Serializable Class
প্রথমে একটি ক্লাস তৈরি করতে হবে যেটি Serializable হবে, অর্থাৎ সেই ক্লাসের অবজেক্টকে সিরিয়ালাইজ করা যাবে। ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।
Example:
import java.io.*;
// Class must implement Serializable interface to be serialized
class Person implements Serializable {
private static final long serialVersionUID = 1L; // Serialization version ID
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters
public String getName() {
return name;
}
public int getAge() {
return age;
}
// ToString Method
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
Explanation:
Personক্লাসSerializableইন্টারফেসটি ইমপ্লিমেন্ট করেছে, তাই এর অবজেক্টটি সিরিয়ালাইজ করা যাবে।serialVersionUIDএকটি ইউনিক আইডি যা সিরিয়ালাইজড অবজেক্টের সংস্করণ চিহ্নিত করে। এটি সুনির্দিষ্টভাবে দেওয়া হলে, পরবর্তীতে যে কোনো সমস্যা ছাড়াই ডেসিরিয়ালাইজ করা যাবে।
Step 2: Serialize the Object
এখন আমরা Person অবজেক্ট সিরিয়ালাইজ করব এবং একটি ফাইলে লিখব।
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// Creating a Person object
Person person = new Person("Alice", 30);
// Serialize the person object to a file
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
out.writeObject(person);
System.out.println("Object has been serialized.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Explanation:
- ObjectOutputStream: এটি ব্যবহার করা হয়েছে
personঅবজেক্টটি একটি ফাইলে (এখানেperson.ser) সিরিয়ালাইজ করতে। - অবজেক্ট সিরিয়ালাইজ করার জন্য
writeObject()মেথড ব্যবহার করা হয়েছে। try-with-resourcesব্যবহার করে স্বয়ংক্রিয়ভাবে স্ট্রিম বন্ধ করা হচ্ছে।
Step 3: Deserialize the Object
এখন আমরা সেই person.ser ফাইল থেকে অবজেক্টটি ডেসিরিয়ালাইজ (পুনরুদ্ধার) করব এবং পুনরায় একটি Person অবজেক্টে রূপান্তরিত করব।
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
// Deserialize the person object from the file
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) in.readObject();
System.out.println("Object has been deserialized.");
System.out.println(person); // Print the deserialized object
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Explanation:
- ObjectInputStream: এটি ব্যবহার করা হয়েছে
person.serফাইল থেকে অবজেক্টটি ডেসিরিয়ালাইজ করতে। - readObject(): এই মেথডের মাধ্যমে সিরিয়ালাইজড অবজেক্টটি ডেসিরিয়ালাইজ করা হচ্ছে।
- অবজেক্টটি ডেসিরিয়ালাইজ করার পর, আমরা
System.out.println()ব্যবহার করে সেটির মান প্রিন্ট করেছি।
Complete Workflow:
- Serialization:
- প্রথমে
Personঅবজেক্টটি তৈরি করা হয় এবংObjectOutputStreamএর মাধ্যমেperson.serফাইলে সিরিয়ালাইজ করা হয়।
- প্রথমে
- Deserialization:
- পরবর্তীতে,
ObjectInputStreamব্যবহার করেperson.serফাইল থেকে অবজেক্টটি ডেসিরিয়ালাইজ করা হয় এবং আবারPersonঅবজেক্টে পুনরুদ্ধার করা হয়।
- পরবর্তীতে,
Output:
Serialization Output:
Object has been serialized.
Deserialization Output:
Object has been deserialized.
Person{name='Alice', age=30}
Considerations and Best Practices:
- serialVersionUID:
- এটি ক্লাসের একটি বিশেষ আইডি যা সিরিয়ালাইজড অবজেক্টের সংস্করণ চিহ্নিত করতে ব্যবহৃত হয়। এটি গুরুত্বপূর্ণ যখন আপনি আপনার ক্লাসের গঠন পরিবর্তন করেন (যেমন ফিল্ড বা মেথড যোগ করা বা পরিবর্তন করা), যাতে পূর্ববর্তী সিরিয়ালাইজড ডেটার সাথে সামঞ্জস্য বজায় থাকে।
Transient Keyword:
- যদি কোনো ফিল্ড সিরিয়ালাইজ করতে না চান, তবে
transientকিওয়ার্ড ব্যবহার করতে পারেন। এই ফিল্ডটি সিরিয়ালাইজেশন প্রক্রিয়ায় উপেক্ষা করা হবে।
Example:
private transient int password; // This will not be serialized- যদি কোনো ফিল্ড সিরিয়ালাইজ করতে না চান, তবে
- Security:
- Serialization-এ নিরাপত্তা ঝুঁকি থাকতে পারে। আপনি যদি ডেটা অপরিচিত সোর্স থেকে ডেসিরিয়ালাইজ করেন, তাহলে সাবধান থাকতে হবে। অপ্রত্যাশিত বা ক্ষতিকারক অবজেক্ট ইনজেকশন হতে পারে।
- Performance:
- Serialization কিছুটা সময়সাপেক্ষ হতে পারে এবং খুব বড় অবজেক্টের ক্ষেত্রে memory ব্যবহারে সমস্যা তৈরি করতে পারে। তাই বড় অবজেক্টগুলোর ক্ষেত্রে পারফরম্যান্স নিয়ে চিন্তা করা উচিত।
- Serialization এবং Deserialization দুটি শক্তিশালী পদ্ধতি যা Java তে অবজেক্ট ডেটা সেভ এবং পুনরুদ্ধারের জন্য ব্যবহৃত হয়।
- Custom Serializable ক্লাস তৈরি করে এবং
ObjectOutputStreamওObjectInputStreamব্যবহার করে আপনি সহজেই অবজেক্টকে ফাইলে সেভ এবং পুনরুদ্ধার করতে পারবেন। - serialVersionUID, transient, এবং security considerations সহ কিছু গুরুত্বপূর্ণ বিষয় রয়েছে, যা অবশ্যই মাথায় রাখতে হবে।
Read more